home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / hplip / toolbox.py < prev    next >
Text File  |  2008-10-13  |  9KB  |  319 lines

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19. #
  20. # Author: Don Welch
  21. #
  22. # Thanks to Henrique M. Holschuh <hmh@debian.org> for various security patches
  23. #
  24.  
  25. __version__ = '14.0'
  26. __title__ = 'HP Device Manager'
  27. __doc__ = "The HP Device Manager (aka Toolbox) for HPLIP supported devices. Provides status, tools, and supplies levels."
  28.  
  29. # Std Lib
  30. import sys
  31. import os
  32. import getopt
  33. import signal
  34.  
  35. # Local
  36. from base.g import *
  37. import base.utils as utils
  38. from base import status, tui
  39.  
  40.  
  41. w = None # write pipe
  42. app = None
  43. toolbox  = None
  44. loc = None
  45. session_bus = None
  46.  
  47. USAGE = [(__doc__, "", "name", True),
  48.          ("Usage: hp-toolbox [OPTIONS]", "", "summary", True),
  49.          utils.USAGE_OPTIONS,
  50.          ("Activate device on startup:", "-d<device_uri> or --device=<device_uri>", "option", False),
  51.          #("Activate printer on startup:", "-p<printer> or --printer=<printer>", "option", False),
  52.          #("Activate function on startup:", "-f<function> or --function=<function>", "option", False),
  53.          ("Disable dbus:", "-x or --disable-dbus", "option", False),
  54.          utils.USAGE_LANGUAGE,
  55.          utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
  56.          utils.USAGE_HELP,
  57.          utils.USAGE_SEEALSO,
  58.          ("hp-info", "", "seealso", False),
  59.          ("hp-clean", "", "seealso", False),
  60.          ("hp-colorcal", "", "seealso", False),
  61.          ("hp-align", "", "seealso", False),
  62.          ("hp-print", "", "seealso", False),
  63.          ("hp-sendfax", "", "seealso", False),
  64.          ("hp-fab", "", "seealso", False),
  65.          ("hp-testpage", "", "seealso", False),
  66.         ]
  67.  
  68. def usage(typ='text'):
  69.     if typ == 'text':
  70.         utils.log_title(__title__, __version__)
  71.  
  72.     utils.format_text(USAGE, typ, __title__, 'hp-toolbox', __version__)
  73.     sys.exit(0)
  74.  
  75.  
  76. def handle_session_signal(*args, **kwds):
  77.     if kwds['interface'] == 'com.hplip.Toolbox' and \
  78.         kwds['member'] == 'Event':
  79.  
  80.         event = device.Event(*args)
  81.  
  82.         if event.event_code > EVENT_MAX_EVENT:
  83.             event.event_code = status.MapPJLErrorCode(event.event_code)
  84.  
  85.         # regular user/device status event
  86.         log.debug("Received event notifier: %d" % event.event_code)
  87.  
  88.         if w is not None:
  89.             log.debug("Sending event to toolbox UI...")
  90.             try:
  91.                 os.write(w, event.pack())
  92.             except OSError:
  93.                 log.debug("Failed. Exiting...")
  94.                 # if this fails, then hp-toolbox must be killed.
  95.                 # No need to continue running...
  96.                 sys.exit(1)
  97.  
  98.  
  99. log.set_module('hp-toolbox(init)')
  100.  
  101. try:
  102.     opts, args = getopt.getopt(sys.argv[1:], 'l:hgq:d:x', 
  103.         ['level=', 'help', 'help-rest', 'help-man', 'help-desc', 
  104.         'lang=', 'device=', 'disable-dbus'])
  105.  
  106. except getopt.GetoptError, e:
  107.     log.error(e.msg)
  108.     usage()
  109.  
  110. if os.getenv("HPLIP_DEBUG"):
  111.     log.set_level('debug')
  112.  
  113. initial_device_uri = None
  114. #initial_printer_name = None
  115. #initial_function = None
  116. disable_dbus = False
  117.  
  118. for o, a in opts:
  119.     if o in ('-l', '--logging'):
  120.         log_level = a.lower().strip()
  121.         if not log.set_level(log_level):
  122.             usage()
  123.  
  124.     elif o == '-g':
  125.         log.set_level('debug')
  126.  
  127.     elif o in ('-h', '--help'):
  128.         usage()
  129.  
  130.     elif o == '--help-rest':
  131.         usage('rest')
  132.  
  133.     elif o == '--help-man':
  134.         usage('man')
  135.  
  136.     elif o == '--help-desc':
  137.         print __doc__,
  138.         sys.exit(0)
  139.  
  140.     elif o in ('-q', '--lang'):
  141.         if a.strip() == '?':
  142.             tui.show_languages()
  143.             sys.exit(0)
  144.  
  145.         loc = utils.validate_language(a.lower())
  146.  
  147.     elif o in ('-d', '--device'):
  148.         initial_device_uri = a
  149.  
  150.     #elif o in ('-f', '--function'):
  151.     #    initial_function = a
  152.  
  153.     elif o in ('-x', '--disable-dbus'):
  154.         disable_dbus = True
  155.  
  156.  
  157.  
  158. utils.log_title(__title__, __version__)
  159.  
  160. if os.getuid() == 0:
  161.     log.warn("hp-toolbox should not be run as root.")
  162.  
  163. ok, lock_file = utils.lock_app('hp-toolbox')
  164. if not ok:
  165.     sys.exit(1)
  166.  
  167. # UI Forms and PyQt
  168. if not utils.canEnterGUIMode():
  169.     log.error("hp-toolbox requires GUI support. Exiting.")
  170.     sys.exit(1)
  171.  
  172. try:
  173.     from dbus import SessionBus
  174.     import dbus.service
  175.     from dbus.mainloop.glib import DBusGMainLoop
  176.     from gobject import MainLoop
  177.  
  178. except ImportError:
  179.     log.error("Unable to load dbus - Automatic status updates in HPLIP Device Manager will be disabled.")
  180.     disable_dbus = True    
  181.  
  182.  
  183. child_pid, w, r = 0, 0, 0
  184.  
  185. if not disable_dbus:
  186.     r, w = os.pipe()
  187.     parent_pid = os.getpid()
  188.     log.debug("Parent PID=%d" % parent_pid)
  189.     child_pid = os.fork()
  190.  
  191. if disable_dbus or child_pid:
  192.     # parent (UI)
  193.     log.set_module("hp-toolbox(UI)")
  194.  
  195.     if w:
  196.         os.close(w)
  197.  
  198.     from qt import *
  199.     from ui.devmgr4 import DevMgr4
  200.  
  201.     # Security: Do *not* create files that other users can muck around with
  202.     os.umask (0037)
  203.  
  204.     # create the main application object
  205.     app = QApplication(sys.argv)
  206.  
  207.     if loc is None:
  208.         loc = user_cfg.ui.get("loc", "system")
  209.         if loc.lower() == 'system':
  210.             loc = str(QTextCodec.locale())
  211.             log.debug("Using system locale: %s" % loc)
  212.  
  213.     if loc.lower() != 'c':    
  214.         e = 'utf8'
  215.         try:
  216.             l, x = loc.split('.')
  217.             loc = '.'.join([l, e])
  218.         except ValueError:
  219.             l = loc
  220.             loc = '.'.join([loc, e])
  221.  
  222.         log.debug("Trying to load .qm file for %s locale." % loc)
  223.         trans = QTranslator(None)
  224.  
  225.         qm_file = 'hplip_%s.qm' % l
  226.         log.debug("Name of .qm file: %s" % qm_file)
  227.         loaded = trans.load(qm_file, prop.localization_dir)
  228.  
  229.         if loaded:
  230.             app.installTranslator(trans)
  231.         else:
  232.             loc = 'c'
  233.  
  234.     if loc == 'c':
  235.         log.debug("Using default 'C' locale")
  236.     else:
  237.         log.debug("Using locale: %s" % loc)
  238.         QLocale.setDefault(QLocale(loc))
  239.         prop.locale = loc
  240.         try:
  241.             locale.setlocale(locale.LC_ALL, locale.normalize(loc))
  242.         except locale.Error:
  243.             pass
  244.  
  245.     toolbox = DevMgr4(r, __version__, initial_device_uri, disable_dbus)
  246.     app.setMainWidget(toolbox)
  247.  
  248.     toolbox.show()
  249.  
  250.     try:
  251.         try:
  252.             log.debug("Starting GUI loop...")
  253.             app.exec_loop()
  254.         except KeyboardInterrupt:
  255.             sys.exit(0)
  256.  
  257.     finally:
  258.         if child_pid:
  259.             log.debug("Killing child toolbox process (pid=%d)..." % child_pid)
  260.             try:
  261.                 os.kill(child_pid, signal.SIGKILL)
  262.             except OSError, e:
  263.                 log.debug("Failed: %s" % e.message)
  264.  
  265.         utils.unlock(lock_file)
  266.         sys.exit(0)
  267.  
  268.  
  269. elif not disable_dbus:
  270.     # dBus
  271.     log.set_module("hp-toolbox(dbus)")
  272.  
  273.     from base import device
  274.  
  275.     try:
  276.         # child (dbus connector)
  277.         os.close(r)
  278.  
  279.         dbus_loop = DBusGMainLoop(set_as_default=True)
  280.  
  281.         try:
  282.             session_bus = dbus.SessionBus()
  283.         except dbus.exceptions.DBusException, e:
  284.             if os.getuid() != 0:
  285.                 log.error("Unable to connect to dbus session bus. Exiting.")
  286.                 sys.exit(1)
  287.             else:
  288.                 log.error("Unable to connect to dbus session bus (running as root?)")            
  289.                 sys.exit(1)
  290.  
  291.         # Receive events from the session bus
  292.         session_bus.add_signal_receiver(handle_session_signal, sender_keyword='sender',
  293.             destination_keyword='dest', interface_keyword='interface',
  294.             member_keyword='member', path_keyword='path')
  295.  
  296.         log.debug("Entering main loop...")
  297.  
  298.         try:
  299.             MainLoop().run()
  300.         except KeyboardInterrupt:
  301.             log.debug("Ctrl-C: Exiting...")
  302.  
  303.         #print "MainLoop exited!"
  304.  
  305.     finally:
  306.         if parent_pid:
  307.             log.debug("Killing parent toolbox process (pid=%d)..." % parent_pid)
  308.             try:
  309.                 os.kill(parent_pid, signal.SIGKILL)
  310.             except OSError, e:
  311.                 log.debug("Failed: %s" % e.message)
  312.  
  313.         utils.unlock(lock_file)
  314.  
  315.     sys.exit(0)
  316.  
  317.  
  318.  
  319.